class Solution(object):
    """
    方法：双指针法，从已排序数组中原地删除重复元素
    
    Args:
        nums: List[int], 已排序的整数数组
    
    Returns:
        int: 删除重复元素后数组的新长度，且原数组的前k个元素应包含不重复元素
    
    Time: O(n), 其中 n 是数组的长度，需要遍历一次数组
    
    Space: O(1), 只使用了常数额外空间
    """
    def removeDuplicates(self, nums):
        length = len(nums)
        if length == 0:
            return 0
        i, j = 1, 1
        while j < length:
            if nums[j] != nums[i-1]:
                nums[i] = nums[j]
                i += 1
            j += 1
        return i
    
    def test_removeDuplicates(self):
        """
        测试 removeDuplicates 方法的各种情况
        """
        # 测试用例1：常规数组，包含重复元素
        nums1 = [1, 1, 2, 2, 3, 4, 4, 5]
        expected1 = [1, 2, 3, 4, 5]
        k1 = self.removeDuplicates(nums1)
        print("测试用例1 - 常规数组：")
        print(f"输入数组: {nums1}")
        print(f"预期结果: 长度={len(expected1)}, 数组前{len(expected1)}个元素={expected1}")
        print(f"实际结果: 长度={k1}, 数组前{k1}个元素={nums1[:k1]}")
        print(f"测试结果: {'通过' if k1 == len(expected1) and nums1[:k1] == expected1 else '失败'}\n")

        # 测试用例2：全部元素相同
        nums2 = [1, 1, 1, 1, 1]
        expected2 = [1]
        k2 = self.removeDuplicates(nums2)
        print("测试用例2 - 全部元素相同：")
        print(f"输入数组: {nums2}")
        print(f"预期结果: 长度={len(expected2)}, 数组前{len(expected2)}个元素={expected2}")
        print(f"实际结果: 长度={k2}, 数组前{k2}个元素={nums2[:k2]}")
        print(f"测试结果: {'通过' if k2 == len(expected2) and nums2[:k2] == expected2 else '失败'}\n")

        # 测试用例3：没有重复元素
        nums3 = [1, 2, 3, 4, 5]
        expected3 = [1, 2, 3, 4, 5]
        k3 = self.removeDuplicates(nums3)
        print("测试用例3 - 没有重复元素：")
        print(f"输入数组: {nums3}")
        print(f"预期结果: 长度={len(expected3)}, 数组前{len(expected3)}个元素={expected3}")
        print(f"实际结果: 长度={k3}, 数组前{k3}个元素={nums3[:k3]}")
        print(f"测试结果: {'通过' if k3 == len(expected3) and nums3[:k3] == expected3 else '失败'}\n")

        # 测试用例4：空数组
        nums4 = []
        expected4 = []
        k4 = self.removeDuplicates(nums4)
        print("测试用例4 - 空数组：")
        print(f"输入数组: {nums4}")
        print(f"预期结果: 长度={len(expected4)}, 数组={expected4}")
        print(f"实际结果: 长度={k4}, 数组={nums4[:k4]}")
        print(f"测试结果: {'通过' if k4 == len(expected4) and nums4[:k4] == expected4 else '失败'}\n")

        # 测试用例5：只有两个元素
        nums5 = [1, 1]
        expected5 = [1]
        k5 = self.removeDuplicates(nums5)
        print("测试用例5 - 只有两个相同元素：")
        print(f"输入数组: {nums5}")
        print(f"预期结果: 长度={len(expected5)}, 数组前{len(expected5)}个元素={expected5}")
        print(f"实际结果: 长度={k5}, 数组前{k5}个元素={nums5[:k5]}")
        print(f"测试结果: {'通过' if k5 == len(expected5) and nums5[:k5] == expected5 else '失败'}")


def main():
    """
    主函数：运行所有测试用例
    """
    solution = Solution()
    print("开始测试 removeDuplicates 方法...")
    print("-" * 50)
    solution.test_removeDuplicates()
    print("-" * 50)
    print("测试完成!")


if __name__ == "__main__":
    main()